package classes;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.LinkedList;

import interfaces.CartaoFidelidade;

public class CartaoFidelidadeImpl implements CartaoFidelidade {

	@Override
	public void adicionarPontos(int codigoCliente, int novosPontos) {
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			
			stm.execute("INSERT INTO pontos VALUES (default," +
					codigoCliente + QueryAssist.comma +
					novosPontos + QueryAssist.comma + 
					"current_date)");					
			
		} catch(IOException e) {
			System.out.println(e);
		} catch(SQLException e) {
			System.out.println(e);
		} catch(ClassNotFoundException e) {
			System.out.println(e);
		}	
	}

	@Override
	public int obterSomaDePontos(int codigoCliente) {
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			
			if(stm.execute("SELECT SUM(num_pontos) AS total FROM pontos WHERE id_cliente = " + codigoCliente)){
				ResultSet res = stm.getResultSet();
				res.next();
				return res.getInt(1);
			} else return 0;
			
		} catch(IOException e) {
			System.out.println(e);
		} catch(SQLException e) {
			System.out.println(e);
			return 0;
		} catch(ClassNotFoundException e) {
			System.out.println(e);
		}	
		return 0;
	}

	@Override
	public void removerPontosAntigos(int codigoCliente) {
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			long num_dias_para_expirar = 30;
			Date data_limite = new Date(System.currentTimeMillis() - num_dias_para_expirar*86400000L);
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			
			stm.execute("DELETE FROM pontos WHERE data < " + QueryAssist.stringValue(sdf.format(data_limite)) + " AND id_cliente = " + codigoCliente);					
			System.out.println(QueryAssist.stringValue(sdf.format(data_limite)));
		} catch(IOException e) {
			System.out.println(e);
		} catch(SQLException e) {
			System.out.println(e);
		} catch(ClassNotFoundException e) {
			System.out.println(e);
		}
		
	}

	@Override
	public boolean utilizarPontos(int codigoCliente, int quantidadePontos) {
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			LinkedList<String> str_list = new LinkedList<String>();			
			
			if(this.obterSomaDePontos(codigoCliente) >= quantidadePontos) { // Garante que as tuplas com os pontos nao serao apagadas desnecessariamente
			
				if(stm.execute("SELECT id,num_pontos FROM pontos WHERE id_cliente = " + codigoCliente + " ORDER BY id" )) {
					ResultSet res = stm.getResultSet();
					
					while(res.next()) {
						if(res.getInt(2) <= quantidadePontos) {
							quantidadePontos -= res.getInt(2);
							str_list.add("DELETE FROM pontos WHERE id = " + res.getInt(1));
						} else {
							str_list.add("UPDATE pontos SET num_pontos = num_pontos - " + quantidadePontos +
									" WHERE id = " + res.getInt(1));
							quantidadePontos = 0;
						}
						
						if(quantidadePontos == 0) {
							Iterator<String> it = str_list.iterator();
							while(it.hasNext()) {
								stm.execute(it.next());
							}
							return true;
						}
					}
				}	
			}
		} catch(IOException e) {
			System.out.println(e);
		} catch(SQLException e) {
			System.out.println(e);
			return false;
		} catch(ClassNotFoundException e) {
			System.out.println(e);
		}	
		return false;
	}

}
